#include "Grupo.h"
#include "Usuario.h"
#include <iostream>

using namespace std;

int Grupo::ID=0;

/**
 * @brief Constructor por defecto
 * @param nomb string nombre del grupo
 * @param _maxUsuarios int numero maximo de usuario que puede contener el grupo
 */
Grupo::Grupo(string nomb,int _maxUsuarios):nombre(nomb),maxUsusarios(_maxUsuarios),usuarios(0),tam(0),id(ID){
    usuarios=new Usuario*[_maxUsuarios];
    ID++;
}

/**
 * Constructo de copia
 */
Grupo::Grupo(const Grupo& orig):nombre(orig.nombre),usuarios(orig.usuarios),maxUsusarios(orig.maxUsusarios),tam(orig.tam),id(ID){
    ID++;
}

/**Destructor de la clase grupo*/
Grupo::~Grupo() {
    if(usuarios) delete[] usuarios;
}

/**
 * @brief Asigna el tamaño al grupo
 * @param tam int tamaño que se le ha a asignar
 */
void Grupo::SetTam(int tam) {
    this->tam = tam;
}

/**
 * @brief Devuelve un entero con el tamaño del grupo
 * @return tamaño del grupo
 */
int Grupo::GetTam() const {
    return tam;
}

/**
 * @brief Asigna el número máximo del usuario
 * @param maxUsusarios int número de usuarios máximos que va a tener el grupo
 */
void Grupo::SetMaxUsusarios(int maxUsusarios) {
    this->maxUsusarios = maxUsusarios;
}

/**@brief Devuelve un entero que será el maximo de usuarios que va a tener
 * @return número maximo de usuario
 */
int Grupo::GetMaxUsusarios() const {
    return maxUsusarios;
}

/**@brief Agrega un usuario al grupo
 * @param usuario Usuario* Puntero a usuario que se va a agregar
 * @pre Usuario* usuario debe estar inicializado, en caso de que el grupo esté lleno aparecerá un mensaje
 */
void Grupo::AddUsuario(Usuario* usuario) {
    if(tam<maxUsusarios){
         this->usuarios[tam++] = usuario;
         usuario->AddGrupo(this);
    }else{
        cout<<"El grupo esta lleno"<<endl;
    }
}

/**@brief Devuelve un vector de punteros a usuario
 * @return vector de punteros en el que indica los grupos en los que está el usuario
 */
Usuario** Grupo::GetUsuarios() const {
    return usuarios;
}

/**@brief Asigna un nombre al grupo
 * @param nombre string con el nombre que se le a asignar
 */
void Grupo::SetNombre(string nombre) {
    this->nombre = nombre;
}

/**@brief Devuelve un string con el nombre del grupo
 * @return string con el nombre del grupo
 */
string Grupo::GetNombre() const {
    return nombre;
}


